home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / mxcode / jmp / device.c < prev    next >
C/C++ Source or Header  |  1994-01-29  |  3KB  |  122 lines

  1. #include <dos.h>
  2.  
  3. #define idxbyte(v, p)    ((char *)&v)[p]
  4. #define dspwrite(val)    while (inportb(sbbase + 0xC) & 0x80) ; \
  5.             outportb(sbbase + 0xC, val)
  6.  
  7. int    sbbase;
  8. int    sbirq;
  9. int    sbdma;
  10.  
  11. int    bufplaying;
  12. int    bufoverlap;
  13. int    bufempty[2];
  14. int    buflength[2];
  15. long    bufaddress[2];
  16.  
  17. int    pageregs[] = {0x87, 0x83, 0x81, 0x82};
  18. int    baseregs[] = {0, 2, 4, 6};
  19. int    countregs[] = {1, 3, 5, 7};
  20.  
  21. void interrupt    sbhandler(void);
  22. void interrupt    (*oldirq)();
  23.  
  24. int
  25. sbinit(int base, int irq, int dma)
  26. {
  27.     sbbase = base;
  28.     sbirq = irq;
  29.     sbdma = dma;
  30.  
  31.     outportb(sbbase + 6, 1);
  32.     inportb(sbbase + 6);
  33.     inportb(sbbase + 6);
  34.     inportb(sbbase + 6);
  35.     inportb(sbbase + 6);
  36.     inportb(sbbase + 6);
  37.     inportb(sbbase + 6);
  38.     outportb(sbbase + 6, 0);
  39.  
  40.     for (irq = 0; irq < 100; irq++)
  41.         if (inportb(sbbase + 0xA) == 0xAA) {
  42.             oldirq = getvect(sbirq + 8);
  43.             setvect(sbirq + 8, sbhandler);
  44.             outportb(0x21, inportb(0x21) & ~(1 << sbirq));
  45.             dspwrite(0xD1);
  46.             return 1;
  47.         }
  48.  
  49.     return 0;
  50. }
  51.  
  52. int
  53. sbrate(int frequency)
  54. {
  55.     if (5000 <= frequency && frequency <= 22000) {
  56.         frequency = 1000000L / frequency;
  57.         dspwrite(0x40);
  58.         dspwrite(256 - frequency);
  59.         return 1000000L / frequency;
  60.     } else
  61.         return 0;
  62. }
  63.  
  64. void
  65. sbdblbuf(char * one, int len1, char * two, int len2)
  66. {
  67.     bufplaying = 0;
  68.     bufoverlap = 0;
  69.     bufempty[0] = 0;
  70.     bufempty[1] = 0;
  71.     buflength[0] = len1-1;
  72.     buflength[1] = len2-1;
  73.     bufaddress[0] = FP_SEG(one) * 16L + FP_OFF(one);
  74.     bufaddress[1] = FP_SEG(two) * 16L + FP_OFF(two);
  75.  
  76.     outportb(0xA, sbdma + 4);
  77.     outportb(0xC, sbdma + 0);
  78.     outportb(0xB, sbdma + 0x48);
  79.     outportb(baseregs[sbdma], idxbyte(bufaddress[bufplaying], 0));
  80.     outportb(baseregs[sbdma], idxbyte(bufaddress[bufplaying], 1));
  81.     outportb(pageregs[sbdma], idxbyte(bufaddress[bufplaying], 2));
  82.     outportb(countregs[sbdma], idxbyte(buflength[bufplaying], 0));
  83.     outportb(countregs[sbdma], idxbyte(buflength[bufplaying], 1));
  84.     outportb(0xA, sbdma + 0);
  85.     dspwrite(0x14);
  86.     dspwrite(idxbyte(buflength[bufplaying], 0));
  87.     dspwrite(idxbyte(buflength[bufplaying], 1));
  88. }
  89.  
  90. void
  91. sbstop(void)
  92. {
  93.     inportb(sbbase + 0xE);
  94.     outportb(0x20, 0x20);
  95.     outportb(0x21, inportb(0x21) | (1 << sbirq));
  96.     setvect(sbirq + 8, oldirq);
  97. }
  98.  
  99. void interrupt
  100. sbhandler(void)
  101. {
  102.     bufempty[bufplaying] = 1;
  103.     bufplaying ^= 1;
  104.     if (bufempty[bufplaying]) bufoverlap = 1;
  105.  
  106.     outportb(0xA, sbdma + 4);
  107.     outportb(0xC, sbdma + 0);
  108.     outportb(0xB, sbdma + 0x48);
  109.     outportb(baseregs[sbdma], idxbyte(bufaddress[bufplaying], 0));
  110.     outportb(baseregs[sbdma], idxbyte(bufaddress[bufplaying], 1));
  111.     outportb(pageregs[sbdma], idxbyte(bufaddress[bufplaying], 2));
  112.     outportb(countregs[sbdma], idxbyte(buflength[bufplaying], 0));
  113.     outportb(countregs[sbdma], idxbyte(buflength[bufplaying], 1));
  114.     outportb(0xA, sbdma + 0);
  115.     dspwrite(0x14);
  116.     dspwrite(idxbyte(buflength[bufplaying], 0));
  117.     dspwrite(idxbyte(buflength[bufplaying], 1));
  118.  
  119.     inportb(sbbase + 0xE);
  120.     outportb(0x20, 0x20);
  121. }
  122.